package jschool.manejadores;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import jschool.entidades.Nomina;
import jschool.entidades.PersonalEscolar;
import jschool.persistencia.Conexion;

public class ManejadorDeNomina {
	private static ManejadorDeNomina instancia = null;
	private ArrayList<Nomina> nominas = null;
	private Conexion conexion = null;
	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	public double ISR = 0.10;
	public double ARS = 0.10;
	public double SP = 0.10;

	private ManejadorDeNomina() {
		conexion = Conexion.getInstancia();
	}

	public static ManejadorDeNomina getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeNomina();
		}
		return instancia;
	}

	public ArrayList<Nomina> getNominas() {
		nominas = new ArrayList<Nomina>();
		try {
			String sql = "SELECT * FROM Nomina";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			rs = conexion.hacerConsulta(sql);
			while (rs.next()) {
				Nomina nomina = new Nomina(rs.getInt(1), rs.getDouble(2), rs
						.getDouble(3), rs.getDouble(4), rs.getDouble(5));
				nominas.add(nomina);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Error Listando Nomina",
					"Error", JOptionPane.ERROR_MESSAGE);
			return null;
		}
		return nominas;
	}

	public int agregarNomina(PersonalEscolar personal) {
		int fila = 0;
		try {
			String sql = "INSERT INTO Nomina(idEmpleado, impuestoSobreLaRenta,"
					+ " seguroSocial, seguroPension, sueldoNeto) VALUES(?,?,?,?,?)";
			double impuestoRenta = personal.getSueldoBruto() * this.ISR;
			double seguroSocial = personal.getSueldoBruto() * this.ARS;
			double seguroPension = personal.getSueldoBruto() * this.SP;
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setInt(1, personal.getidEmpleado());
			stmt.setDouble(2, impuestoRenta);
			stmt.setDouble(3, seguroSocial);
			stmt.setDouble(4, seguroPension);
			stmt.setDouble(5, personal.getSueldoBruto()
					- (impuestoRenta + seguroSocial + seguroPension));
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Agregando Empleado a la Nomina", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}

	public int eliminarNomina(int id) {
		int fila = 0;
		try {
			String sql = "DELETE FROM Nomina WHERE idEmpleado = ?";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setInt(1, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Eliminando Empleado de la Nomina", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}

	public int modificarNomina(PersonalEscolar personal, int id) {
		int fila = 0;
		try {
			double impuestoRenta = personal.getSueldoBruto() * this.ISR;
			double seguroSocial = personal.getSueldoBruto() * this.ARS;
			double seguroPension = personal.getSueldoBruto() * this.SP;
			String sql = "UPDATE Nomina SET impuestoSobreLaRenta = ?, seguroSocial = ?, "
					+ "seguroPension = ?, sueldoNeto = ? WHERE idEmpleado = ?";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setDouble(1, impuestoRenta);
			stmt.setDouble(2, seguroSocial);
			stmt.setDouble(3, seguroPension);
			stmt.setDouble(4, personal.getSueldoBruto()
					- (impuestoRenta + seguroSocial + seguroPension));
			stmt.setInt(5, id);
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Modificando Nomina del Empleado", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}
}
